package com.fyb.aicar.controller;


import com.fyb.aicar.config.PromptTemplate;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.ollama.api.OllamaOptions;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Base64;
import java.util.Random;
import java.util.UUID;

@RestController
@RequestMapping("/api/ai")
public class CarController {

    @Autowired
    private ChatClient.Builder chatClientBuilder; // Spring AI 自动注入

//    @Autowired
//    private ToolCallbackProvider tools;
    /**
     * 通用问答接口（纯文字）
     */
    @RequestMapping("/chat")
    public String chat(@RequestParam("message") String message) {
        return buildClient().prompt(message).call().content();
    }

    /**
     * 图片+文字问答接口（多模态）
     * 前端 FormData 传两个字段：
     *   image: File   图片文件
     *   text : String 问题描述
     */
    @RequestMapping("/chat-image")
    public String chatWithImage(@RequestParam("image") MultipartFile image,
                                @RequestParam("text")  String text) throws Exception {
        // 1. 图片 → base64
        String base64 = Base64.getEncoder().encodeToString(image.getBytes());
        // 2. 构造多模态 prompt（Spring AI 对 ollama 的 image 支持就是插标签）
        String prompt = text + base64TJpg(base64);;
        return buildClient().prompt(prompt).call().content();
    }

    private String base64TJpg(String base64){
//        String base64 = "/9j/4AAQSkZJRgABAQAAAQ……";   // 把完整串贴进来
        byte[] imgBytes = Base64.getDecoder().decode(base64);
        Random random = new Random();
        String pathString = "output" + UUID.randomUUID() + random.nextInt(100000) + ".jpg";
        Path path = Paths.get(pathString);
        try {
            Files.write(path, imgBytes);                   // 完工
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        System.out.println("已生成 " + path.toAbsolutePath());
        return String.valueOf(path.toAbsolutePath());
    }

    /* 统一创建 ChatClient，保证模型和工具一致 */
    private ChatClient buildClient() {
        return chatClientBuilder
                .defaultSystem(PromptTemplate.system())
//                .defaultUser(PromptTemplate.user())
//                .defaultTools(tools)
                .defaultOptions(OllamaOptions.builder()
                        .model("gemma3:4b")
                        .temperature(0.7)
                        .build())
                .build();
    }
}
